home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / Apps / SoundApps / aa_m68k_Only / Sonogram / convsh2ml.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-12-20  |  4.0 KB  |  140 lines

  1.  
  2. //
  3. //    convsh2ml        A sound converter
  4. //
  5. //        Ver. 1.1
  6. //
  7. //    v1.0 1991/3/18
  8. //    v1.1 1991/4/11    does not use SNDConvertSound
  9. //
  10. //    HiroshiMomose
  11. //        Zoology, UCD, Davis, CA 95616   hmomose@ucdavis.edu
  12. //
  13. //    To compile, type : cc -O -g -o convsh2ml convsh2ml.c -lsys_s
  14. //
  15.  
  16. #define title ("convsh2ml.c - converts a 44.1 kHz stereo 16 bit linear .snd file to 22kHz mono")
  17. #define pname    "convsh2ml"
  18.  
  19. #import <sound/sound.h>
  20. #import <stdio.h>
  21.  
  22. #define MONO    1
  23. #define STEREO    2
  24.  
  25. check_error(int err)
  26. {
  27.     if (err) {
  28.     fprintf(stderr, "Error(%s): %s\n",pname, SNDSoundError(err));
  29.     exit(1);
  30.     }
  31.     return err;
  32. }
  33.  
  34. main (int argc, char *argv[])
  35. {
  36.  
  37.     int            i, size, width, temp, nsamples;
  38.     int            datasize, dataformat, samplingrate, channelcount, info;
  39.     char        channel = 'L';
  40.     short int    ldata1, rdata1, ldata2, rdata2;
  41.     int            tempdata;
  42.     char        *p;
  43.     short int    *ip;
  44.     SNDSoundStruct    *infile;    // input sound file
  45.     SNDSoundStruct header = {
  46.         SND_MAGIC, 0, 0, SND_FORMAT_LINEAR_16, (int)SND_RATE_LOW, 2, "" };
  47.     FILE        *outfile;        // for output, we don't.
  48.  
  49.  
  50.     // ========== Check command line flag
  51.     if ( argc == 4 )
  52.         channel = toupper( argv[1][0] );
  53.     if ( ( channel != 'L') && ( channel != 'R' ) ) {
  54.         fprintf( stderr, "Error(%s): wrong channel %c (must be L or R)\n", pname, channel );
  55.         exit( -1 );
  56.     }    
  57.     if( argc < 4 ) {
  58.         fprintf( stderr, "%s\n\n", title );
  59.         fprintf( stderr, "Usage : %s channel infile outfile\n\n\t", pname );
  60.         fprintf( stderr, "channel must be either L or R (case does not matter)\n\t" );
  61.         fprintf( stderr, "infile must be a 44kHz 16bit linear stereo .snd file\n\t" );
  62.         fprintf( stderr, "outfile will be a 16bit linear monaural .snd file\n\t" );
  63.         fprintf( stderr, "Doesn't check if outfile already exists. So be careful.\n\n" );
  64.         fprintf( stderr, "Sample operation : %s L stereo.snd mono.snd\n", pname );
  65.         exit( -1 );
  66.     }    
  67.  
  68.     // ========== Open input file
  69.     check_error( SNDReadSoundfile( argv[2], &infile ));
  70.  
  71.     // ========== open output file
  72.     if (( outfile = fopen ( argv[3], "wb" )) == 0 ) {
  73.         fprintf( stderr, "Error(%s): Can't open input file : %s\n", pname, argv[1] );
  74.         exit( -1 );
  75.     }
  76.  
  77.     // ========== Read input file header
  78.     check_error( SNDGetDataPointer( infile, &p, &size, &width ));
  79.     dataformat        = infile->dataFormat;
  80.     channelcount    = infile->channelCount;
  81.     dataformat        = infile->dataFormat;
  82.     datasize        = infile->dataSize;
  83.     samplingrate    = infile->samplingRate;
  84.     channelcount    = infile->channelCount;
  85.     nsamples        = SNDSampleCount( infile );        // no. of data samples
  86.  
  87.     datasize /= 2;        // Size of the sound data will be half
  88.  
  89.     // ========== Check file format
  90.     if( channelcount != STEREO ) {
  91.         fprintf( stderr, "Error(%s): Input file %s is not stereo\n", pname, argv[1] );
  92.         exit( -1 );
  93.     }    
  94.     if( dataformat != SND_FORMAT_LINEAR_16 ) {
  95.         fprintf( stderr, "Error(%s): Input file %s is not 16bit linear\n", pname, argv[1] );
  96.         exit( -1 );
  97.     }    
  98.  
  99.     // ========== Write output file header    
  100.     temp = SND_MAGIC;            fwrite( &temp, 4, 1, outfile );
  101.     temp = 28;                    fwrite( &temp, 4, 1, outfile );    // start point of sound data
  102.     temp = datasize;            fwrite( &temp, 4, 1, outfile );    // no. of bytes in sound data
  103.     temp = dataformat;            fwrite( &temp, 4, 1, outfile );
  104.     temp = (int)SND_RATE_LOW;    fwrite( &temp, 4, 1, outfile );
  105.     temp = MONO;                fwrite( &temp, 4, 1, outfile );    // channel count
  106.     temp = 0x00000000;          fwrite( &temp, 4, 1, outfile );    // info. string
  107.  
  108.     // ========== Write output sound data    
  109.  
  110.     ip = (short int *)p;
  111.     
  112.     nsamples /= 2;                // since we are reading 2 samples in each loop
  113.     if ( channel == 'L' ) {
  114.         while ( nsamples-- > 0 ) {
  115.             ldata1 = ( *(ip++) );
  116.             rdata1 = ( *(ip++) );
  117.             ldata2 = ( *(ip++) );
  118.             rdata2 = ( *(ip++) );
  119.             tempdata = ((int) ( ldata1 + ldata2 ) ) / 2;
  120.             ldata2 = (short int)tempdata;
  121.             fwrite ( &ldata2, 2, 1, outfile );
  122.         }
  123.     } else {
  124.         while ( nsamples-- > 0 ) {
  125.             ldata1 = ( *(ip++) );
  126.             rdata1 = ( *(ip++) );
  127.             ldata2 = ( *(ip++) );
  128.             rdata2 = ( *(ip++) );
  129.             tempdata = ((int) ( rdata1 + rdata2 ) ) / 2;
  130.             rdata2 = (short int)tempdata;
  131.             fwrite ( &rdata2, 2, 1, outfile );
  132.         }
  133.     }
  134.     SNDFree( infile );
  135.     fclose( outfile );
  136.     exit( 0 );
  137. }
  138.  
  139.  
  140.